#pragma once
#include "common.h"

enum KEY
{
  KEY_A,
  KEY_B,
  KEY_C,
  KEY_D,
  KEY_E,
  KEY_F,
  KEY_G,
  KEY_H,
  KEY_I,
  KEY_J,
  KEY_K,
  KEY_L,
  KEY_M,
  KEY_N,
  KEY_O,
  KEY_P,
  KEY_Q,
  KEY_R,
  KEY_S,
  KEY_T,
  KEY_U,
  KEY_V,
  KEY_W,
  KEY_X,
  KEY_Y,
  KEY_Z,

  KEY_0,
  KEY_1,
  KEY_2,
  KEY_3,
  KEY_4,
  KEY_5,
  KEY_6,
  KEY_7,
  KEY_8,
  KEY_9,

  KEY_MINUS,
  KEY_EQUAL,
  KEY_LEFT_BRACKET,
  KEY_RIGHT_BRACKET,
  KEY_SEMICOLON,
  KEY_QUOTE,
  KEY_COMMA,
  KEY_DOT,
  KEY_SLASH,
  KEY_BACKSLASH,
  KEY_GRAVE,

  KEY_SPACE,
  KEY_TAB,
  KEY_RETURN,
  KEY_BACKSPACE,

  // Non-printable
  KEY_ESCAPE,

  KEY_F1,
  KEY_F2,
  KEY_F3,
  KEY_F4,
  KEY_F5,
  KEY_F6,
  KEY_F7,
  KEY_F8,
  KEY_F9,
  KEY_F10,
  KEY_F11,
  KEY_F12,
  KEY_F13,
  KEY_F14,
  KEY_F15,

  KEY_KP_NUM_LOCK,
  KEY_CAPS_LOCK,
  KEY_LSHIFT,
  KEY_LCTRL,
  KEY_LALT,
  KEY_LWIN,
  KEY_RSHIFT,
  KEY_RCTRL,
  KEY_RALT,
  KEY_RWIN,

  KEY_INSERT,
  KEY_DELETE,
  KEY_HOME,
  KEY_END,
  KEY_PAGE_UP,
  KEY_PAGE_DOWN,
  KEY_SCROLL_LOCK,
  KEY_PAUSE,

  KEY_KP_ASTERISK,
  KEY_KP_DECIMAL,
  KEY_KP_8,
  KEY_KP_2,
  KEY_KP_3,
  KEY_KP_0,

  KEY_UP,
  KEY_DOWN,
  KEY_LEFT,
  KEY_RIGHT
};

extern const int8_t* key_names[];

inline bool is_digit(int8_t ch)
{ return ch >= '0' && ch <= '9'; }

inline bool is_upper(int8_t ch)
{ return ch >= 'A' && ch <= 'Z'; }

inline bool is_whitespace(int8_t ch)
{ return ch == ' '  || 
         ch == '\f' || 
         ch == '\n' ||
         ch == '\r' ||
         ch == '\t' ||
         ch == '\b' ||
         ch == '\v'; }

inline bool is_key_printable(KEY key)
{ return key < KEY_ESCAPE; }
